﻿
#include "Engine/common.h"
#include "Engine/uimgr.h"
#include "Engine/ControlDef.h"
#include "strid.h"
#include "DNF定义.h"
#include "设置模块.h"
#include "AppUI.h"


CImage* Ctrl装备面板;
static int NextX;
static int NextY;

//每行20件，件横向间隔4像素，滚动条16像素，两边留空(700-16-20*28-19*4)/2=24
//纵向间隔：行间隔4像素，部位间隔10像素，顶部留空10
//总高度能大致容纳即可，不需要精确计算
const int 边距=24;
const int 横向间距=4;
const int 纵向间距=4;
const int 行距=10;

void 同步装备详情();		//UI装备详情区.cpp
void 自定义设置失效处理(int 部位,int 索引);	//UI装备详情区.cpp
void 同步打造部位图标(int 部位,int 装备区索引);	//UI打造区.cpp
int 获取装备图标ResId(int 部位,int 装备区索引,BOOL 灰色图标);
int 装备变更回调(UIControl* CtrlObj,UIEvent_t UIEvent,PVOID Param1,PVOID Param2);
int 装备选择变更回调(UIControl* CtrlObj,UIEvent_t UIEvent,PVOID Param1,PVOID Param2);

extern int 当前选择部位;
extern int 当前选择装备;
extern BOOL 装备选择变化;

void 详细构建_装备面板(int PageId,CImage* Ctrl装备面板)
{
	::Ctrl装备面板=Ctrl装备面板;

	NextX=边距;
	NextY=行距;

	int EquipIndex=0;
	//定义的部位顺序和装备面板的UI一致
	for (int 部位=0;部位<全部装备部位总数;部位++)
	{
		for (int i=0;i<部位装备数量[部位];i++)
		{
			//首次初始化时，还没有选择职业，对武器获取ResId返回-1，没有影响
			int ResId=获取装备图标ResId(部位,i,FALSE);
			SetCreateControlParam(NextX,NextY,Ctrl装备面板,PageId_Setting);
			//尽管点击已选择装备不会引起设置切换，但是仍会改变当前选择装备，导致装备详情页面显示更改
			CImage* Ctrl装备图标=EasyCreateImage(CID_装备图标+EquipIndex,28,28,ResId,GetIconType(ResId));
			Ctrl装备图标->SetEventHandler(装备选择变更回调);
			Ctrl装备图标->SetUserData((PVOID)(部位<<16|i));
			//图标遮罩覆盖在图标上，起到变暗的效果；当前选中的装备隐藏遮罩
			//点击同一装备图标不会引起切换，因此只需要遮罩在回调函数发起计算
			CImage* Ctrl装备遮罩=EasyCreateImage(CID_装备图标遮罩+EquipIndex,28,28,RID_装备图标遮罩);
			Ctrl装备遮罩->SetEventHandler(装备变更回调);
			Ctrl装备遮罩->SetUserData((PVOID)(部位<<16|i));
		
			NextX+=28+横向间距;
			if (i%20==19)
			{
				NextX=边距;
				NextY+=28+纵向间距;
			}
			EquipIndex++;
		}
		NextX=边距;
		NextY+=28+行距;
	}
}

void 重置设置_装备面板()
{
	//武器图标和职业相关
	for (int i=0;i<部位装备数量[武器];i++)
	{
		CImage* Ctrl装备图标=EasyFindControl<CImage>(PageId_Setting,CID_装备图标+部位起始索引[武器]+i);
		//这个函数会自动判断职业，返回正确的图标
		int ResId=获取装备图标ResId(武器,i,FALSE);
		Ctrl装备图标->SetImage(EasyLoadImageR(ResId));
	}
	for (int i=0;i<部位装备数量[武器贴膜];i++)
	{
		CImage* Ctrl装备图标=EasyFindControl<CImage>(PageId_Setting,CID_装备图标+部位起始索引[武器贴膜]+i);
		//这个函数会自动判断职业，返回正确的图标
		int ResId=获取装备图标ResId(武器贴膜,i,FALSE);
		Ctrl装备图标->SetImage(EasyLoadImageR(ResId));
	}
	//重置遮罩，并按当前选择隐藏图标遮罩
	int EquipIndex=0;
	for (int i=0;i<全部装备部位总数;i++)
	{
		for (int j=0;j<部位装备数量[i];j++)
		{
			CImage* Ctrl装备遮罩=EasyFindControl<CImage>(PageId_Setting,CID_装备图标遮罩+EquipIndex);
			Ctrl装备遮罩->SetVisible(TRUE);
			EquipIndex++;
		}
		//设置的定义顺序和装备部位一致
		int Index=GetIndexSetting(设置_上衣+i);
		CImage* Ctrl装备遮罩=EasyFindControl<CImage>(PageId_Setting,CID_装备图标遮罩+部位起始索引[i]+Index);
		Ctrl装备遮罩->SetVisible(FALSE);
	}
}

void 退出清理_装备面板()
{

}

int 装备选择变更回调(UIControl* CtrlObj,UIEvent_t UIEvent,PVOID Param1,PVOID Param2)
{
	if (UIEvent==EvtClick)
	{
		int 部位=HIWORD((int)CtrlObj->GetUserData());
		int 索引=LOWORD((int)CtrlObj->GetUserData());
		if (当前选择部位!=部位 || 当前选择装备!=索引)
		{
			//选择未选中的装备会导致自定义系列切换，由于装备专属词条不同，设置的4个词条失效，取消选择
			//但是选择已选中的装备，仅展示内容切换，词条不失效，继续按原设置展示
			if (部位>=上衣 && 部位<=武器)
			{

			}
			int 设置=GetIndexSetting(设置_上衣+部位);
			if (设置==索引)
			{
			}

			装备选择变化=TRUE;
			当前选择部位=部位;
			当前选择装备=索引;
			同步装备详情();
		}
		CHTabView* Ctrl信息区=EasyFindControl<CHTabView>(PageId_Setting,CID_信息区);
		Ctrl信息区->SetDisplayTab(2);
	}
	return 0;
}

int 装备变更回调(UIControl* CtrlObj,UIEvent_t UIEvent,PVOID Param1,PVOID Param2)
{
	if (UIEvent==EvtClick)
	{
		int 部位=HIWORD((int)CtrlObj->GetUserData());
		int 索引=LOWORD((int)CtrlObj->GetUserData());
		if (当前选择部位!=部位 || 当前选择装备!=索引)
		{
			装备选择变化=TRUE;
			当前选择部位=部位;
			当前选择装备=索引;
			//切换当前选中装备图标，期间不会触发事件，无需设置UI_AdjustState
			int PrevIndex=GetIndexSetting(设置_上衣+部位);	//同一部位
			CImage* Ctrl装备遮罩=EasyFindControl<CImage>(PageId_Setting,CID_装备图标遮罩+部位起始索引[部位]+PrevIndex);
			Ctrl装备遮罩->SetVisible(TRUE);
			Ctrl装备遮罩=EasyFindControl<CImage>(PageId_Setting,CID_装备图标遮罩+部位起始索引[部位]+索引);
			Ctrl装备遮罩->SetVisible(FALSE);
			//如果变更部位和打造面板的目标部位一致，会同步图标
			同步打造部位图标(部位,索引);
			//如果选择的自定义装备发生了变化，由于装备系列专属词条不同，设置的4个词条失效，取消选择
			//而点击亮图标，选择已选中的装备，仅展示内容切换，词条不失效，继续按原设置展示
			自定义设置失效处理(部位,索引);
			//设置只需要保持装备区的索引，转换函数负责主要工作
			//根据职业、部位、条件，将索引转换成对应的装备对象
			//计算完成后，会自动调用 同步装备详情() 更新装备详情面板
			ChangeSettingByUI_Index(设置_上衣+部位,索引);
			SubmitSettingChange();
		}
	}
	return 0;
}

//装备的UI展示顺序和部位定义一致，设置使用此索引
//但是装备索引的定义是武器在最后面，图标和名称使用此索引（计算模块的装备对象也是）
//这个函数将2种索引转换
int 获取装备图标ResId(int 部位,int 装备区索引,BOOL 灰色图标)
{
	int ResId=RID_装备图标;
	if (灰色图标)
		ResId=RID_装备图标灰色;
	switch (部位)
	{
	case 上衣:
		return ResId+无上衣+装备区索引;
	case 下装:
		return ResId+无下装+装备区索引;
	case 护肩:
		return ResId+无护肩+装备区索引;
	case 腰带:
		return ResId+无腰带+装备区索引;
	case 鞋子:
		return ResId+无鞋子+装备区索引;
	case 手镯:
		return ResId+无手镯+装备区索引;
	case 项链:
		return ResId+无项链+装备区索引;
	case 戒指:
		return ResId+无戒指+装备区索引;
	case 左槽:
		return ResId+无左槽+装备区索引;
	case 右槽:
		return ResId+无右槽+装备区索引;
	case 耳环:
		return ResId+无耳环+装备区索引;
	case 称号:
		return ResId+无称号+装备区索引;
	case 宠物:
		return ResId+无宠物+装备区索引;

	case 上衣贴膜:
		return ResId+无上衣贴膜+装备区索引;
	case 下装贴膜:
		return ResId+无下装贴膜+装备区索引;
	case 护肩贴膜:
		return ResId+无护肩贴膜+装备区索引;
	case 腰带贴膜:
		return ResId+无腰带贴膜+装备区索引;
	case 鞋子贴膜:
		return ResId+无鞋子贴膜+装备区索引;
	case 手镯贴膜:
		return ResId+无手镯贴膜+装备区索引;
	case 项链贴膜:
		if (装备区索引>=馥郁的欢愉-无项链贴膜 && !灰色图标)
			return RID_太初_馥郁的欢愉+(装备区索引-(馥郁的欢愉-无项链贴膜));
		return ResId+无项链贴膜+装备区索引;
	case 戒指贴膜:
		if (装备区索引>=红兔-无戒指贴膜 && !灰色图标)
			return RID_太初_红兔+(装备区索引-(红兔-无戒指贴膜));
		return ResId+无戒指贴膜+装备区索引;
	case 左槽贴膜:
		return ResId+无左槽贴膜+装备区索引;
	case 右槽贴膜:
		return ResId+无右槽贴膜+装备区索引;
	case 耳环贴膜:
		return ResId+无耳环贴膜+装备区索引;

	case 武器:
		if (装备区索引==0)
			return ResId+无武器;
		else if (CurrentJob==职业_光明骑士女)
			return ResId+吞噬本源光杖+(装备区索引-1);
		else if (CurrentJob==职业_流浪武士)
			return ResId+吞噬本源光剑+(装备区索引-1);

	case 武器贴膜:
		if (装备区索引==0)
			return ResId+无武器贴膜;
		else if (CurrentJob==职业_光明骑士女)
			return ResId+巴卡尔光杖贴膜;
		else if (CurrentJob==职业_流浪武士)
			return ResId+巴卡尔光剑贴膜;
	}
	return -1;
}

WCHAR* 获取装备名称(int 部位,int 装备区索引)
{
	//装备名称和ResId的定义一一对应
	int ResId=-1;
	if (部位==项链贴膜)
		ResId=RID_装备图标+无项链贴膜+装备区索引;
	else if (部位==戒指贴膜)
		ResId=RID_装备图标+无戒指贴膜+装备区索引;
	else
		ResId=获取装备图标ResId(部位,装备区索引,FALSE);

	if (ResId==-1)
		return L" ";
	return DNF装备名称[ResId-RID_装备图标];
}

int 获取装备对象索引(int 部位,int 装备区索引)
{
	//装备索引和ResId的定义一一对应
	int ResId=-1;
	if (部位==项链贴膜)
		ResId=RID_装备图标+无项链贴膜+装备区索引;
	else if (部位==戒指贴膜)
		ResId=RID_装备图标+无戒指贴膜+装备区索引;
	else
		ResId=获取装备图标ResId(部位,装备区索引,FALSE);

	if (ResId==-1)
		return -1;
	return ResId-RID_装备图标;
}

DNF品质 获取装备品质(int 部位,int 装备区索引)
{
	if (装备区索引==0)
		return 普通;	//无装备
	if (部位>=上衣 && 部位<=耳环)
	{
		if (装备区索引==37)	//领域之主
			return 传说;
		return 史诗;
	}
	else 
	{
		if (部位==武器)
		{
			if ((装备区索引-1)%14==6)	//红皮武器
				return 传说;
			return 史诗;
		}
		if (部位==称号)
		{
			DNF品质 称号品质[13]={普通,神器,稀有,传说,稀有,神器,传说,稀有,稀有,稀有,传说,稀有,稀有};
			return 称号品质[装备区索引];
		}
		if (部位==宠物)
			return 稀有;
		if (部位==项链贴膜 || 部位==戒指贴膜)
		{
			if (装备区索引>=18)
				return 太初;
			return 史诗;
		}
		if (部位==左槽贴膜 || 部位==右槽贴膜 || 部位==耳环贴膜)
		{
			if (装备区索引==18)
				return 传说;
			return 史诗;
		}
		return 史诗;
	}
}


